/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import Utilidades.ExibirMensagens;
import Utilidades.VariaveisEstaticas;
import dominio.Produto;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;

import javax.faces.bean.SessionScoped;
import negocio.ManterProdutoNegocio;

/**
 *
 * @author Gutto, Cícero
 * Classe usada para receber e fazer requisições com o servidor.
 */
@ManagedBean
@SessionScoped
public class ManterProdutoBean {

    private ManterProdutoNegocio manterProdutoNegocio;
    private Produto produto;
    private String codigo;
    private String preco;
    private boolean exibeTabela;
    /** Estrutura de dados usada para armazenar os produtos contidos no banco de dados<br>
     * Será usada para exibir a lista dos produtos na tela.
     */
    private List<Produto> produtos;
    /** Variável que irá receber o valor false quando o usuário selecionar algum produto.*/
    private boolean naoSelecionouProduto = true;

    public ManterProdutoBean() {
        inicializarAtributos();
    }

    /**
     * Método que inicializa todos os atributos do ManterProdutoBean
     */
    private void inicializarAtributos(){
        manterProdutoNegocio = new ManterProdutoNegocio();
        produto = new Produto();
        produtos = new ArrayList<Produto>();
        codigo = "";
        preco = "";
        exibeTabela = false;
    }

    /**
     * Método que irá chamar o método create() da classe ManterProdutoNegócio.
     *
     */
    public void create() {
        produto.setCodigo(Integer.parseInt(codigo));
        produto.setPreco(Double.parseDouble(preco));
        /** Variável usada para receber o retorno do método create() da classe manterProdutoNegócio.<br>
         * Esse retorno é usado para saber se o produto foi armazenado ou não, distinguindo assim os possíveis erros.
         */
        int res = manterProdutoNegocio.create(produto);
        /** switch usado para mostrar a mensagem de inserção ao usário de acordo com o valor da
         * variável res.
         */
        exibeTabela = false;
        switch (res) {
            case VariaveisEstaticas.SUCESSO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(0), new Integer(0)});
                inicializarAtributos();

                break;
            case VariaveisEstaticas.ERRO_DUPLICACAO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(1), new Integer(1), new Integer(0)});
                break;
            case VariaveisEstaticas.ERRO_BD:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                break;
        }
    }

    /**
     * Método que irá chamar o edit da classe manterProdutoNegocio. É usado para editar um produto.
     *
     */
    public void edit() {
        produto.setCodigo(Integer.parseInt(codigo));
        produto.setPreco(Double.parseDouble(preco));
        int res = manterProdutoNegocio.edit(produto);
        exibeTabela = false;
        switch (res) {
            case VariaveisEstaticas.SUCESSO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(0), new Integer(1)});

                naoSelecionouProduto = true;   // Caso ele consiga excluir o produto, então essa variável irá receber true para desabilitar o botão.
                //produto = new Produto();
                inicializarAtributos();
                break;

            case VariaveisEstaticas.ERRO_DUPLICACAO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(1), new Integer(1), new Integer(0)});
                break;
            case VariaveisEstaticas.ERRO_BD:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                break;
        }
    }

    /**
     * Método que irá chamar o destroy() da classe manterProdutoNegocio, será chamado para excluir um produto.
     *
     */
    public void destroy() {
        int res = manterProdutoNegocio.destroy(produto);
        exibeTabela = false;
        switch (res) {
            case VariaveisEstaticas.SUCESSO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(0), new Integer(2)});

                naoSelecionouProduto = true;   // Caso ele consiga excluir o produto, então essa variável irá receber true para desabilitar o botão.
                inicializarAtributos();
                //produto = new Produto();    // Zera todos os atributos do produto para que os campos na página fiquem vazios.
                break;
            case VariaveisEstaticas.ERRO_BD:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                break;
        }
    }

    /** Método que tem a função de buscar todos os produtos no BD e armazena-los na estrutura produtos*/
    public void findProdutoEntities() {
        exibeTabela = true;
        produtos = manterProdutoNegocio.findProdutoEntities();

    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getPreco() {
        return preco;
    }

    public void setPreco(String preco) {
        this.preco = preco;
    }

    public boolean isExibeTabela() {
        return exibeTabela;
    }

    public void setExibeTabela(boolean exibeTabela) {
        this.exibeTabela = exibeTabela;
    }

    public boolean isNaoSelecionouProduto() {
        return naoSelecionouProduto;
    }

    public void setNaoSelecionouProduto(boolean naoSelecionouProduto) {
        this.naoSelecionouProduto = naoSelecionouProduto;
    }
}
